package br.edu.infnet.model;

import java.io.Serializable;

import javax.persistence.*;

import br.edu.infnet.dto.ClienteDTO;

import java.util.Date;
import java.util.Iterator;
import java.util.List;


/**
 * The persistent class for the cliente database table.
 * 
 */
@Entity
@NamedQuery(name="Cliente.findAll", query="SELECT c FROM Cliente c")
public class Cliente implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="PK_CLIENTE")
	private int pkCliente;
	

	private String celular;

	@Temporal(TemporalType.DATE)
	@Column(name="CLIENTE_DESDE")
	private Date clienteDesde;

	@Temporal(TemporalType.DATE)
	@Column(name="DT_NASCIMENTO")
	private Date dtNascimento;

	@Column(name="ED_COMPLEMENTO")
	private String edComplemento;
	
	@Column(name="TIPO_CLIENTE")
	private String tipoCliente;

	private String email;

	private String nome;

	@Column(name="NU_INSCRICAO")
	private String nuInscricao;

	private String senha;

	private String telefonefixo;

	//bi-directional many-to-one association to Conta
	@OneToMany(mappedBy="cliente")
	private List<Conta> contas;

	@Column(name="FK_ENDERECO")
	private int endereco;

	public Cliente() {
		//endereco = new Endereco();
		//contas = new ArrayList<Conta>();
	}

	public int getPkCliente() {
		return this.pkCliente;
	}

	public void setPkCliente(int pkCliente) {
		this.pkCliente = pkCliente;
	}

	public String getCelular() {
		return this.celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public Date getClienteDesde() {
		return this.clienteDesde;
	}

	public void setClienteDesde(Date clienteDesde) {
		this.clienteDesde = clienteDesde;
	}

	public Date getDtNascimento() {
		return this.dtNascimento;
	}

	public void setDtNascimento(Date dtNascimento) {
		this.dtNascimento = dtNascimento;
	}

	public String getEdComplemento() {
		return this.edComplemento;
	}

	public void setEdComplemento(String edComplemento) {
		this.edComplemento = edComplemento;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNuInscricao() {
		return this.nuInscricao;
	}

	public void setNuInscricao(String nuInscricao) {
		this.nuInscricao = nuInscricao;
	}

	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getTelefonefixo() {
		return this.telefonefixo;
	}

	public void setTelefonefixo(String telefonefixo) {
		this.telefonefixo = telefonefixo;
	}

	public List<Conta> getContas() {
		return this.contas;
	}

	protected void setContas(List<Conta> contas) {
		this.contas = contas;
	}

	public Conta addConta(Conta conta) {
		getContas().add(conta);
		conta.setCliente(this);

		return conta;
	}

	public Conta removeConta(Conta conta) {
		getContas().remove(conta);
		conta.setCliente(null);

		return conta;
	}

	public int getEndereco() {
		return this.endereco;
	}

	public void setEndereco(int endereco) {
		this.endereco = endereco;
	}
	
	
	public String getTipoCliente() {
		return tipoCliente;
	}

	public void setTipoCliente(String tipoCliente) {
		this.tipoCliente = tipoCliente;
	}

	
	public static String getFindAll() {
		return "Cliente.findAll";
	}
	
	
	public ClienteDTO toDTO() {
		ClienteDTO dto = new ClienteDTO();
		
		/*Mapper mapper = new DozerBeanMapper();
        dto = mapper.map(this, ClienteDTO.class);*/
		
		dto.setCelular(celular);
		dto.setClienteDesde(clienteDesde);
		
		Iterator<Conta> iter = contas.iterator();
		
		while(iter.hasNext()) {
			dto.addConta(iter.next().toDTO());
		}
		
		
		dto.setDtNascimento(dtNascimento);
		dto.setEdComplemento(edComplemento);
		dto.setEmail(email);
		dto.setEndereco(endereco);
		dto.setNome(nome);
		dto.setNuInscricao(nuInscricao);
		dto.setPkCliente(pkCliente);
		dto.setSenha(senha);
		dto.setTelefonefixo(telefonefixo);
		dto.setTipoCliente(tipoCliente);

        
        return dto;
	}
	
	public ClienteDTO toDTOLazy() {
		ClienteDTO dto = new ClienteDTO();
		
		/*Mapper mapper = new DozerBeanMapper();
        dto = mapper.map(this, ClienteDTO.class);*/
		
		dto.setCelular(celular);
		dto.setClienteDesde(clienteDesde);
		
		/*Iterator<Conta> iter = contas.iterator();
		
		while(iter.hasNext()) {
			dto.addConta(iter.next().toDTO());
		}*/
				
		dto.setDtNascimento(dtNascimento);
		dto.setEdComplemento(edComplemento);
		dto.setEmail(email);
		dto.setEndereco(endereco);
		dto.setNome(nome);
		dto.setNuInscricao(nuInscricao);
		dto.setPkCliente(pkCliente);
		dto.setSenha(senha);
		dto.setTelefonefixo(telefonefixo);
		dto.setTipoCliente(tipoCliente);

        
        return dto;
	}
	
	
	
	@Override
	public String toString() {
		return "Cliente [pkCliente=" + pkCliente + ", celular=" + celular
				+ ", clienteDesde=" + clienteDesde + ", dtNascimento="
				+ dtNascimento + ", edComplemento=" + edComplemento
				+ ", tipoCliente=" + tipoCliente + ", email=" + email
				+ ", nome=" + nome + ", nuInscricao=" + nuInscricao
				+ ", senha=" + senha + ", telefonefixo=" + telefonefixo
				+ ", contas=" + contas + ", endereco=" + endereco + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((nuInscricao == null) ? 0 : nuInscricao.hashCode());
		result = prime * result + pkCliente;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cliente other = (Cliente) obj;
		if (nuInscricao == null) {
			if (other.nuInscricao != null)
				return false;
		} else if (!nuInscricao.equals(other.nuInscricao))
			return false;
		if (pkCliente != other.pkCliente)
			return false;
		return true;
	}
	
	
	
	


}